package cl.zeke.cursos.jsf2spring3jpa2.negocio.services;

import cl.zeke.cursos.jsf2spring3jpa2.dao.Ejercicio5PersonaDao;
import cl.zeke.cursos.jsf2spring3jpa2.negocio.entities.Persona;
import cl.zeke.cursos.jsf2spring3jpa2.negocio.exceptions.LogicaNegocioException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Ejercicio5PersonaService {
    
    private static Logger log = LoggerFactory.getLogger(Ejercicio5PersonaService.class);
    
    @PersistenceContext
    private EntityManager em;
    
    @Autowired
    private Ejercicio5PersonaDao ejercicio5PersonaDao;

    @Transactional(readOnly=true)
    public List<Persona> traerTodasPersonas() {
        return ejercicio5PersonaDao.traerTodos();
    }

    @Transactional(readOnly=false)
    public void guardarPersona(Persona persona) throws LogicaNegocioException {
        if(persona.getNombre().toUpperCase().trim().equals("ZEKE")) {
            throw new LogicaNegocioException("Zeke es un nombre reservado");
        }

        Persona pAux = em.find(Persona.class, persona.getRut());
        
        if(pAux == null) {
            em.persist(persona);
        }
        else {
            persona = em.merge(persona);
        }
        
        log.debug("Se guardo exitosamente");
    }
    
    @Transactional(readOnly=false)
    public void eliminarPersona(Persona persona) throws LogicaNegocioException {
        persona = em.merge(persona);
        em.remove(persona);
    }

    @Transactional(readOnly=true)
    public Persona traerPersonaPorRut(Integer rut) {
        return ejercicio5PersonaDao.traerPorRut(rut);
    }

}
